package modelo.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Condicionante;
import modelo.servicio.Documentos;
import modelo.servicio.Historicos;

public class CondicionanteDAO { //extends AbstractDAO<Condicionante> {

    private String query;

    public void add(Condicionante entity) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "EXEC SSMA_ALTER_CONDICIONANTE_P ";
            query += "'I'";
            query += ", '" + entity.getHistorico().getUsuarioCrea().replace("'", "''") + "'";
            query += ", 0";
            query += ", '" + entity.getDescripcion().replace("'", "''") + "'";
            query += ", '" + entity.getDocumento().getClave().replace("'", "''") + "'";
            query += ", " + (entity.getPeriodicidad() == null ? "NULL" : "'" + (entity.getPeriodicidad() + "'"));
            query += ", 'CR'";
            if (entity.getFechaCumplimiento() != null) {
                query += ", '" + (new SimpleDateFormat("dd/MM/yyyy").format(entity.getFechaCumplimiento())) + "'";
            } else {
                query += ", NULL";
            }
            query += ", " + (entity.getDuracion() == null ? "NULL" : ("'" + entity.getDuracion() + "'"));
            query += entity.getResponsable() == null ? ", NULL" : ", '" + entity.getResponsable().replace("'", "''") + "'";
            query += ", '" + entity.getTipo() + "'";
            query += entity.getRutaGuia() == null ? ", NULL" : ", '" + entity.getRutaGuia().replace("'", "''") + "'";
            query += ", '" + (entity.getNumero() == null ? "0" : entity.getNumero().replace("'", "''")) + "'";
            query += ", " + (entity.getTipoGuia() == null ? "NULL" : ("'" + entity.getTipoGuia().replace("'", "''") + "'"));
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 CODA-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 CODA-SQL " + ex.getMessage());
            }
        }
    }

    public void update(Condicionante entity) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "EXEC SSMA_ALTER_CONDICIONANTE_P ";
            query += "'U'";
            query += ", '" + entity.getHistorico().getUsuarioCrea().replace("'", "''") + "'";
            query += ", " + entity.getIdCondicionante();
            query += ", '" + entity.getDescripcion().replace("'", "''") + "'";
            query += ", '" + entity.getDocumento().getClave().replace("'", "''") + "'";
            query += ", " + (entity.getPeriodicidad() == null ? "NULL" : "'" + (entity.getPeriodicidad().replace("'", "''") + "'"));
            query += ", '" + entity.getHistorico().getEstado() + "'";
            if (entity.getFechaCumplimiento() != null) {
                query += ", '" + (new SimpleDateFormat("dd/MM/yyyy").format(entity.getFechaCumplimiento())) + "'";
            } else {
                query += ", NULL";
            }
            query += ", " + (entity.getDuracion() == null ? "NULL" : ("'" + entity.getDuracion().replace("'", "''") + "'"));
            query += entity.getResponsable() == null ? ", NULL" : ", '" + entity.getResponsable().replace("'", "''") + "'";
            query += ", '" + entity.getTipo().replace("'", "''") + "'";
            query += entity.getRutaGuia() == null ? ", NULL" : ", '" + entity.getRutaGuia().replace("'", "''") + "'";
            query += ", '" + (entity.getNumero() == null ? "0" : entity.getNumero().replace("'", "''")) + "'";
            query += ", " + (entity.getTipoGuia() == null ? "NULL" : ("'" + entity.getTipoGuia().replace("'", "''") + "'"));
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 CODU-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 CODU-SQL " + ex.getMessage());
            }
        }
    }

    protected synchronized List<Condicionante> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Condicionante> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Condicionante>();
            while (resultado.next()) {
                Condicionante cond = new Condicionante();
                cond.setIdCondicionante(Integer.parseInt(resultado.getString("ID_CONDICIONANTE")));
                cond.setDescripcion(resultado.getString("DESCRIPCION"));
                cond.setPeriodicidad(resultado.getString("PERIODICIDAD"));
                cond.setDocumento(Documentos.instancia().obtenerPorId(resultado.getString("CLAVE_DOC")));
                cond.setHistorico(Historicos.instancia().obtenerPorId(resultado.getInt("ID_HISTORICO")));
                cond.setDuracion(resultado.getString("DURACION"));
                cond.setResponsable(resultado.getString("RESPONSABLE"));
                cond.setTipo(resultado.getString("TIPO"));
                cond.setRutaGuia(resultado.getString("RUTA_GUIA"));
                cond.setTipoGuia(resultado.getString("TIPO_GUIA"));
                cond.setFechaCumplimiento(resultado.getDate("FECHA"));
                cond.setNumero(resultado.getString("NUMERO"));
                resultados.add(cond);
            }
        } catch (SQLException ex) {
            throw new DAOException("1 CODS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 CODS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Condicionante> selectAll() throws DAOException {
        query = "SELECT * FROM SSMA_CONDICIONANTES_T WHERE ";
        query += " ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        return select();
    }

    public List<Condicionante> selectWhere(String condition) throws DAOException {
        query = "SELECT * FROM SSMA_CONDICIONANTES_T WHERE (" + condition + ")";
        query += " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        return select();
    }
}
